predani stringu pomoci Message

Otázka od: Petr Kuklik

16. 10. 2002 15:15

Dobry den,
  potreboval bych poradit. Pomoci SendMessage si chci od aplikace
vyzadat nejaka data zavisla na parametru, ktery mam ve stringu. Tento
string by se mel prenest v Message treba v parametru wParam. Staci
kdyz wParam naplnim takto

var Param : string;
Param := 'abc';
SendMessage(Nekdo, Nejaka_MSG, integer(PChar(Param)), 0);

nebo musim alokovat pamet, nejaky buffer, a jeji adresu poslat?

Petr
Kuklik

______________________________________________________________________
Reklama:
S Oskarovymi Tarify nove generace budete ve srovnani s predplacenymi
konkurencnimi kartami volat za stejnou cenu az o 50% více.
http://ad2.seznam.cz/redir.cgi?instance=35722%26url=http://www.oskarmobil.cz/links/news.php?param=tarify

Odpovedá: dphi_forum@proces.sk

16. 10. 2002 16:00


Cav
      pozri si v helpe win32 spravu WM_COPYDATA


The WM_COPYDATA message is sent when an application passes data to another
application.

WM_COPYDATA
wParam = (WPARAM) (HWND) hwnd; // handle of sending window
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data

An application must use the SendMessage function to send this message, not
the PostMessage function.
The data being passed must not contain pointers or other references to
objects not accessible to the application receiving the data.
While this message is being sent, the referenced data must not be changed
by another thread of the sending process.
The receiving application should consider the data read-only. The pcds
parameter is valid only during the processing of the message. The receiving
application should not free the memory referenced by pcds. If the receiving
application must access the data after SendMessage returns, it must copy
the data into a local buffer.



                                                                                

                      Petr Kuklik

                      <Petr.Kuklik@sez To: delphi-l@clexpert.cz

                      nam.cz> cc:

                      Sent by: Subject: predani stringu pomoci
Message
                      delphi-l-owner@c

                      lexpert.cz

                                      
                                                                                

                      16.10.2002 15:17

                      Please respond

                      to delphi-l

                                      
                                                                                





Dobry den,
  potreboval bych poradit. Pomoci SendMessage si chci od aplikace
vyzadat nejaka data zavisla na parametru, ktery mam ve stringu. Tento
string by se mel prenest v Message treba v parametru wParam. Staci
kdyz wParam naplnim takto

var Param : string;
Param := 'abc';
SendMessage(Nekdo, Nejaka_MSG, integer(PChar(Param)), 0);

nebo musim alokovat pamet, nejaky buffer, a jeji adresu poslat?

Petr
Kuklik

______________________________________________________________________
Reklama:
S Oskarovymi Tarify nove generace budete ve srovnani s predplacenymi
konkurencnimi kartami volat za stejnou cenu az o 50% více.
http://ad2.seznam.cz/redir.cgi?instance=35722%26url=http://www.oskarmobil.cz/links/news.php?param=tarify



Odpovedá: Malecek Ondrej

16. 10. 2002 16:49

Pokud si to predavas uvnitr aplikace tak staci:

GetMem( pszTemp, xxx);
SendMessage( ..., ..., WPARAM( pszTemp), 0);

A v obsluze pak uvolnit pamet:
FreeMem( msg.wParam, xxx);

Potencialne by asi slo pouzivat globalni promenou typu string, ale to by byl
dost chaos. Tak jak to mas napsane, by to asi taky melo fungovat taky, ale
predpokladam, ze PostMessage volas uvnitr nejake funkce => promenna Param je
na stacku => bude zrusena po navratu z funkce => je potreba s tim pocitat.

Pokud si to chces prehazovat mezi aplikacemi, je potreba pouzit WM_COPYDATA.

O  

> -----Původní zpráva-----
Dobry den,
> potreboval bych poradit. Pomoci SendMessage si chci od aplikace
> vyzadat nejaka data zavisla na parametru, ktery mam ve stringu. Tento
> string by se mel prenest v Message treba v parametru wParam. Staci
> kdyz wParam naplnim takto
>
> var Param : string;
> Param := 'abc';
> SendMessage(Nekdo, Nejaka_MSG, integer(PChar(Param)), 0);
>
> nebo musim alokovat pamet, nejaky buffer, a jeji adresu poslat?

Odpovedá: Libor Junek, KSH-Data

16. 10. 2002 16:46

Poslat pointer do jineho procesu nelze protoze procesy nemaji sdilenou
pamet.
Jedno reseni by bylo udelat to pomoci zpravy WM_COPYDATA (to jsem nikdy
nezkousel takze nevim jak je to narocne). Dalsi reseni je pomoci mapovani
souboru (princip DDE) to je jednoduche. Je to psane jen tak na kolene takze
se omlouvam za pripadne nedostatky ale princip bude jasny.

procedure SendText(const Text: String);
var
  hMapFile: THandle;
  lpMapAddr: lptstr;
begin
  hMapFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 1024,
'MyObjectFileMapping');
  try
    lpMapAddr := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    Move(Text[1], lpMapAddr[0], Length(Text));
    FlushViewOfFile(lpMapAddr, Length(lpMapAddr));
    SendMessage({Tady zadej handle aplikace / formu kam to chces poslat} ,
{Zprava po ktere to chces poslat treba WM_USER + X}, 0, 0);
  finally
    CloseHandle(hMapFile);
  end;
end;


// Tohle slouzi pro prijem zpravy
procedure TForm1.WMUser(var Message: TMessage);
var
  hMapFile: THandle;
  lpMapAddr: lptstr;
begin
  hMapFile := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
'MyObjectFileMapping');
  lpMapAddr := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  ShowMessage(lpMapAddr);
  UnmapViewOfFile(lpMapAddr);
end;

Libor

> -----Original Message-----
> Behalf Of Petr Kuklik
> Sent: Wednesday, October 16, 2002 3:17 PM
> Subject: predani stringu pomoci Message
>
> potreboval bych poradit. Pomoci SendMessage si chci od aplikace
> vyzadat nejaka data zavisla na parametru, ktery mam ve stringu. Tento
> string by se mel prenest v Message treba v parametru wParam. Staci
> kdyz wParam naplnim takto
>
> var Param : string;
> Param := 'abc';
> SendMessage(Nekdo, Nejaka_MSG, integer(PChar(Param)), 0);
>
> nebo musim alokovat pamet, nejaky buffer, a jeji adresu poslat?
>
> Petr
> Kuklik

Odpovedá: Martin Schayna

16. 10. 2002 15:33

----- Original Message -----
From: "Petr Kuklik" <Petr.Kuklik@seznam.cz>
> potreboval bych poradit. Pomoci SendMessage si chci od aplikace
> vyzadat nejaka data zavisla na parametru, ktery mam ve stringu. Tento
> string by se mel prenest v Message treba v parametru wParam. Staci
> kdyz wParam naplnim takto
>
> var Param : string;
> Param := 'abc';
> SendMessage(Nekdo, Nejaka_MSG, integer(PChar(Param)), 0);
>
> nebo musim alokovat pamet, nejaky buffer, a jeji adresu poslat?

Pokud si posilas tu message v ramci jedne aplikace, tj. neprekrocis
hranici sveho procesu, muzes to udelat timto zpusobem. Jinak musis
pouzit neco jineho -- napr. WM_COPYDATA, viz MSDN

Martin Schayna


Odpovedá: p.sestak@corag.sk

16. 10. 2002 20:34

"Libor Junek, KSH-Data" <junek@ksh-data.cz>
Sent by: delphi-l-owner@clexpert.cz
16.10.2002 16:35
Please respond to delphi-l

 
        To: <delphi-l@clexpert.cz>
        cc:
        Subject: RE: predani stringu pomoci Message

Samozrejme ze to ide, vid WIN32 API: ReadProcessMemory();
druhej aplikacii posles pointer platny len v tvojom adresnom priestore a
tam si musi
aplikacia otvorit proces( OpenProcess() ) a precitat si jeho pamat pomocou
ReadProcessMemory().
lospalos.

>Poslat pointer do jineho procesu nelze protoze procesy nemaji sdilenou
>pamet.
>Jedno reseni by bylo udelat to pomoci zpravy WM_COPYDATA (to jsem nikdy
>nezkousel takze nevim jak je to narocne). Dalsi reseni je pomoci mapovani
>souboru (princip DDE) to je jednoduche. Je to psane jen tak na kolene
takze
>se omlouvam za pripadne nedostatky ale princip bude jasny.



Odpovedá: Petr Vones

16. 10. 2002 20:31

From: <p.sestak@corag.sk>
> Samozrejme ze to ide, vid WIN32 API: ReadProcessMemory();
> druhej aplikacii posles pointer platny len v tvojom adresnom priestore a
> tam si musi
> aplikacia otvorit proces( OpenProcess() ) a precitat si jeho pamat pomocou
> ReadProcessMemory().

Tyto funkce jsou ale primarne urceny spis pro ladeni a pokud vim, tak je treba
na ne mit i dostatecna prava. Spravne reseni je pomoci WM_COPYDATA nebo jineho
IPC (mapped file, mailslot, nebo i sockety ...)

Petr Vones